// 引入 http 模块用于创建 HTTP 服务器
const http = require('http');
// 引入 fs 模块用于文件系统操作
const fs = require('fs');
// 引入 path 模块用于处理文件路径
const path = require('path');

// 获取命令行参数（process.argv 第一个是 node 路径，第二个是脚本路径，所以从第三个开始取参数）
const args = process.argv.slice(2);
// 存储要读取的文件路径
let filePath;

// 判断是否传入了命令行参数（文件名称）
if (args.length > 0) {
  // 拼接当前目录与传入的文件名称，得到目标文件路径
  filePath = path.join(__dirname, args[0]);
} else {
  // 未传入参数，默认读取当前文件（fileReader2.js）的路径
  filePath = path.join(__dirname, 'fileReader2.js');
}

// 创建 HTTP 服务器
const server = http.createServer((req, res) => {
  // 打开文件（异步方式）
  fs.open(filePath, 'r', (err, fd) => {
    if (err) {
      // 文件打开失败（如文件不存在），设置响应状态码为 404，返回错误信息
      res.writeHead(404, { 'Content-Type': 'text/plain' });
      res.end(`错误：文件 ${filePath} 不存在或无法打开。`);
      return;
    }

    // 定义存储文件内容的缓冲区，这里先初始化为 1024 字节大小（可根据需求调整）
    const buffer = Buffer.alloc(1024);
    // 读取文件内容（从文件描述符 fd 对应的文件中，读取内容到 buffer 中）
    fs.read(fd, buffer, 0, buffer.length, 0, (readErr, bytesRead) => {
      if (readErr) {
        // 文件读取过程中出错，设置响应状态码为 500，返回错误信息
        res.writeHead(500, { 'Content-Type': 'text/plain' });
        res.end('文件读取过程中发生错误。');
        // 关闭文件（即使读取出错，也要关闭文件描述符）
        fs.close(fd, (closeErr) => {
          if (closeErr) {
            console.error('关闭文件时出错：', closeErr);
          }
        });
        return;
      }

      // 从缓冲区中提取实际读取的内容（因为可能读取的字节数小于缓冲区大小）
      const content = buffer.slice(0, bytesRead).toString('utf8');
      // 设置响应状态码为 200，内容类型为纯文本，返回文件内容
      res.writeHead(200, { 'Content-Type': 'text/plain' });
      res.end(content);

      // 关闭文件（读取成功后，关闭文件描述符）
      fs.close(fd, (closeErr) => {
        if (closeErr) {
          console.error('关闭文件时出错：', closeErr);
        }
      });
    });
  });
});

// 服务器监听 8081 端口
server.listen(8081, () => {
  console.log('服务器已启动，监听端口 8081。请访问 http://localhost:8081');
});